[Docker] Docker 實作篇 - Image、Container

鼠年全馬鐵人挑戰 - WEEK 11

前言

之前簡單的介紹過Docker後,本篇文紀錄Docker系統架構及操作Image、Container的基本指令。

Docker 系統架構

Docker系統架構主要是Client-Server架構,Client 端稱為Docker Client,Server端稱為Docker Daemon

當我們對docker下指令時,會發request給Docker Daemon去執行指令對應的工作。

Docker Daemon做哪些事?

  • 管理多個container
  • 管理多個從DockerHub pull下來或是在本地由dockerfile建立的Image
  • 將本地建立好Image推到雲端上的repository

Hands on Lab

初步了解Docker 系統架構後,接著來著手學習相關指令吧!

Docker 登入

1
docker login

執行上述指令後,輸入自己在Docker Hub上建立的帳號密碼就可以登入了

Docker image相關的基本指令

查看相關指令說明

1
docker run --help

查看所有的image

執行下方指令會列出所有local端的image

1
docker images

遠端下載image

Docker Hub 上有大量的Image可以用,如果要從遠端的Docker Registry 下載至本地端,可以執行

1
docker pull image_name

docker pull Image名稱的格式有兩種:

  • Docker Registry位址:位址的格式一般是 <網域名/IP>[:連接埠號碼]。 預設位址是 Docker Hub。
  • Repository name:Repository name是兩段式名稱: <使用者名稱>/image_name:image_tag。對於 Docker Hub,若未給定使用者名稱,則預設為從官方的image,也就是library

範例: pull非官方的Image


例如今天我的docker hub上已經有個自己build好的image(如上圖),我要將其pull下來,我可以執行下方指令

1
docker pull tom861012/imagedemo:0.0.1.RELEASE

tom861012為我的docker hub帳號,imagedemo為image名稱而0.0.1.RELEASE為tag名。

範例: 從官方的Image pull MySQL Image

將image_name替換成目標image,例如要下載MySQL這個image

1
docker pull mysql

查找相關的image

若要查找存放在remote repository的image,可以用search這個指令

1
docker search image_name

範例: MySQL Image

將image_name替換成目標image,例如要查找MySQL相關image

1
docker search mysql

查看目標image的歷史紀錄

1
docker image history image_name

查看目標image的相關數據資料

1
docker image inspect image_name

刪除local端的image

1
2
3
docker image remove image
或是
docker rmi

一次刪除不必要(未使用)的image

1
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

替image加上tag

1
docker tag  Image ID repository_address:image_tag

若在沒有指定 TAG 是哪個版本的情況下,預設會是latest表示最新版本,當然我們也自訂tag 名稱,如:加入Repository 版本號,打包出來的 Docker Image,後面的TAG 就會從latest 變成指定的版本號了。
實務上為了易於辨識,通常會在Tag中加入版本號。

Container相關的基本指令

建立並執行docker container

1
docker run -p port:container_port repository:image_tag_name
  • -p: 為--publish 的簡寫
  • repository 為DockerHub所存放Repository,其中包含多個Image,每個Image有不同的標籤(tag)
  • image_tag_name : image的tag name

執行docker run時,若本地端無此Image存在時,會從DockerHub上找目標Repository拉下來(pull down)到本地

docker run中間的過程

  • 先在local image cache尋找該image
  • 若找不到該image,會往遠端的image repository尋找(預設為Docker Hub)
  • 拉下(pull)下載最新版本的image
  • 根據pull下來的image來建新的container
  • 在 docker engine 裡面給 container 私有網路上的虛擬 ip
  • 開啟主機端的port(看你設定哪個port)並轉址到 containe的port(若沒有下--publish指令就不會打開任何 port)

背景執行: detach

docker run的指令中加上--detach(或是簡寫-d),可以讓docker在背景執行。

1
docker run -p port:container_port -d repository:image_tag_name

這個指令會印出container ID

查看執行中的 Docker Container

1
docker container ls

執行上述指令可以查看container相關的資訊,如ID、名稱、執行的Command、建立時間、所在的Image及對應的port等等。
或是執行下方指令也可以

1
docker ps

停止docker container

1
docker container stop containerID(可以取前四個)

或是將stop指令改為kill也可以

1
docker container kill containerID(可以取前四個)

雖然stopkill都可以將container停止,兩者的區別在於kill指令是強行終止container,而stop是循序的,會先给container發送一個TERM訊號(signal),讓container做一些退出前必须的安全性操作,container自动停止運作,相對之下較為優雅(graceful)

刪除 container

1
docker rm containerID

清理所有停止運行的container

1
docker container prune

啟動已終止容器

利用start指令,將一個已經終止的容器啟動執行

1
docker start container_name或id

觀察 container 的資源使用量

1
docker stats 

stats指令會顯示目前所有執行中的 container所吃掉的 CPU, 記憶體, 網路和磁碟 I/O 等等,它是即時性的!讓使用者可以知道每個 Container 使用掉多少的系統資源。

限制container記憶體的使用量

加上-m這個指令參數表示--memory,可以指定記憶體的容量限制,如下方範例為限制512m

1
docker run -p port:container_port -d -m 512m repository:image_tag_name

限制container CPU的使用量

加上--cpu-quota這個指令參數可以指定 CPU 資源限制,最大為1000000,下方範例為上限的一半: 500000

1
docker run -p port:container_port -d -m 512m --cpu-quota=500000 repository:image_tag_name

查看log

查看container id的log

1
docker logs containerID(可以取前四個)

docker system相關的基本指令

查看docker系統資訊

1
docker system info

查看硬碟使用情況

用了一段時間Docker後,會發現它佔用了不少硬碟空間,如果想知道硬碟的使用情況可以加上df指令

1
docker system df

監控事件活動

Docker 有提供events指令用來監聽Docker的事件紀錄,可用來查找問題,例如容器一直執行不起來的時候,就可以使用 docker events 來觀察到底是失敗在哪一個階段。

1
docker system events

下這個指令時,記得要開另外一個終端機,因為這個指令是一直持續監控事件的狀態,所以要一直讓他run才有辦法監聽事件

刪除所有未使用的 containers, networks, images

1
docker system prune

參考教學

docker 快速學習自我挑戰 Day1

docker入門觀念

手把手教你安裝、使用 docker 並快速產生 Anaconda 環境 (1)

Comments